"""
JD商城采集器配置文件
"""

import os
from typing import Dict, Any

class JDConfig:
    """JD商城采集器配置类"""
    
    # 基础配置
    BASE_URL = "https://mall.jd.com"
    DEFAULT_TIMEOUT = 30
    TIMEOUT = 30
    RETRY_COUNT = 3
    RETRY_DELAY = 2
    LOGIN_URL = "https://passport.jd.com/new/login.aspx"
    
    # 文件配置
    LOG_FILE = "jd_scraper.log"
    OUTPUT_DIR = "."
    
    # Chrome浏览器配置 - 优化反检测
    CHROME_OPTIONS = [
        '--no-sandbox',
        '--disable-dev-shm-usage',
        '--disable-gpu',
        '--disable-web-security',
        '--disable-features=VizDisplayCompositor',
        '--disable-extensions',
        '--disable-plugins',
        # 反检测相关配置
        '--disable-blink-features=AutomationControlled',  # 禁用自动化控制标识
        '--exclude-switches=enable-automation',  # 排除自动化开关
        '--disable-automation',  # 禁用自动化
        '--useAutomationExtension=false',  # 不使用自动化扩展
        '--disable-infobars',  # 禁用信息栏
        '--disable-default-apps',  # 禁用默认应用
        '--disable-popup-blocking',  # 禁用弹窗阻止
        '--disable-translate',  # 禁用翻译
        '--disable-background-timer-throttling',  # 禁用后台定时器限制
        '--disable-renderer-backgrounding',  # 禁用渲染器后台化
        '--disable-backgrounding-occluded-windows',  # 禁用被遮挡窗口的后台化
        '--disable-ipc-flooding-protection',  # 禁用IPC洪水保护
        '--no-first-run',  # 跳过首次运行
        '--no-default-browser-check',  # 不检查默认浏览器
        '--disable-component-extensions-with-background-pages',  # 禁用带后台页面的组件扩展
        '--disable-background-networking',  # 禁用后台网络
        '--disable-sync',  # 禁用同步
        '--metrics-recording-only',  # 仅记录指标
        '--disable-default-apps',  # 禁用默认应用
        '--mute-audio',  # 静音
        '--disable-logging',  # 禁用日志
        '--disable-permissions-api',  # 禁用权限API
        '--disable-client-side-phishing-detection',  # 禁用客户端钓鱼检测
    ]
    
    # 用户代理池 - 随机选择更真实的UA
    USER_AGENTS = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
    ]
    
    # 默认用户代理
    USER_AGENT = USER_AGENTS[0]
    
    # 等待时间配置 - 优化速度
    WAIT_TIMES = {
        'page_load': 8,         # 页面加载等待时间
        'element_wait': 3,      # 元素等待时间
        'scroll_delay': 0.5,    # 滚动延时
        'click_delay': 0.3,     # 点击延时
        'human_delay_min': 0.2, # 人工延时最小值
        'human_delay_max': 0.8, # 人工延时最大值
        'login_delay_min': 1,   # 登录时延时最小值
        'login_delay_max': 3,   # 登录时延时最大值
    }
    
    # 日志配置
    LOG_CONFIG = {
        'level': 'INFO',
        'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
        'file': 'jd_scraper.log',
        'max_size': 10 * 1024 * 1024,  # 10MB
        'backup_count': 5,
    }
    
    # 数据提取配置
    SELECTORS = {
        # 商品列表页面选择器 - 基于实际HTML结构
        'product_list': '.gl-item, .jSubObject',  # 商品项目
        'title': '.jDesc a',  # 商品标题
        'price': '.jdNum, .jPrice .jdNum',  # 价格
        'image': '.jPic img',  # 商品图片
        'link': '.jDesc a',  # 商品链接
        'shop_name': '.p-shop a, .gl-i-wrap .p-shop a',  # 店铺名称
        'next_page': '.jPageNext, .fp-next, .pn-next',  # 下一页按钮
        
        # 商品详情页面选择器
        'product_detail': {
            'title': '.sku-name, #name h1',  # 商品标题
            'price': '.p-price .price, #summary-price .p-price',  # 价格
            'original_price': '.p-price .price-m, #summary-price .price-m',  # 原价
            'images': '.spec-list img, #spec-list img',  # 商品图片
            'description': '.detail-content, #detail .detail-content',  # 商品描述
            'specifications': '.parameter2, #parameter-brand',  # 规格参数
            'shop_info': '.shop-info, #crumb-wrap .shop',  # 店铺信息
            'comments': '.comment-item, .comment-list .comment-item',  # 评论
            'stock': '.stock, .choose-result .stock',  # 库存信息
            'sales': '.sales, .choose-result .sales',  # 销量信息
        }
    }
    
    # 输出配置
    OUTPUT_CONFIG = {
        'formats': ['json', 'txt'],  # 支持的输出格式
        'json_file': 'jd_products.json',
        'txt_file': 'jd_products_formatted.txt',
        'encoding': 'utf-8',
        'ensure_ascii': False,
        'indent': 2,
    }
    
    # API集成配置
    API_CONFIG = {
        'backend_url': os.getenv('JD_BACKEND_URL', 'http://localhost:8000/api/products/'),
        'timeout': 30,
        'retry_count': 3,
        'batch_size': 10,  # 批量发送大小
    }
    
    # Redis配置
    REDIS_CONFIG = {
        'host': os.getenv('REDIS_HOST', 'localhost'),
        'port': int(os.getenv('REDIS_PORT', 6379)),
        'db': int(os.getenv('REDIS_DB', 0)),
        'password': os.getenv('REDIS_PASSWORD'),
        'task_key': 'jd_scraping_tasks',
        'result_key': 'jd_scraping_results',
    }
    
    # 反检测配置
    ANTI_DETECTION = {
        'enable_stealth': True,  # 启用隐身模式
        'random_viewport': True,  # 随机视口大小
        'simulate_human_behavior': True,  # 模拟人类行为
        'random_delays': True,  # 随机延时
        'fake_plugins': True,  # 伪造插件信息
        'fake_webgl': True,  # 伪造WebGL信息
    }
    
    @classmethod
    def get_chrome_options(cls) -> list:
        """获取Chrome选项列表"""
        return cls.CHROME_OPTIONS.copy()
    
    @classmethod
    def get_headers(cls) -> Dict[str, str]:
        """获取HTTP请求头"""
        return {
            'User-Agent': cls.USER_AGENT,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Accept-Encoding': 'gzip, deflate, br',
            'Connection': 'keep-alive',
            'Upgrade-Insecure-Requests': '1',
            'Sec-Fetch-Dest': 'document',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'none',
            'Cache-Control': 'max-age=0',
        }
    
    @classmethod
    def get_random_user_agent(cls) -> str:
        """获取随机用户代理"""
        import random
        return random.choice(cls.USER_AGENTS)
    
    @classmethod
    def update_config(cls, **kwargs) -> None:
        """更新配置"""
        for key, value in kwargs.items():
            if hasattr(cls, key.upper()):
                setattr(cls, key.upper(), value) 